package org.rkuk.kasutil.media
{
	import flash.events.Event;
	
	/**
	 * 反应IMediaSource对象加载和播放状态的事件.
	 * 当操作IMediaSource对象执行加载。播放、停止、暂停、继续等动作
	 * 或者IMediaSource对象处于缓冲、播放完毕等状态时会发出MediaSourceEvent
	 * @author rkuk
	 */
	public class MediaSourceEvent extends Event
	{
		//定义事件名称，MediaStream和MediaSound根据操作和自身状态会发出八种事件
		/**
		 * IMediaSource对象加载时，当其各种属性和操作可用时发出此事件.
		 * 在此事件发出之前IMediaSource对象不可用，因此创建IMediaSource对象对象后，需要征听到此事件之后，在对其进行操作。
		 */
		public static const READY:String = "ready";
		
		/**
		 * 当操作IMediaSource对象播放时发出此事件.
		 * 从播放执行完成到IMediaSource对象真正播放之间可能会存在一定时间间隔，即播放操作和IMediaSource对象真正播放可能是异步的（也可能是同步的），
		 * 此事件是在播放操作执行之后，IMediaSource对象真正播放时才发出。
		 * @see org.rkuk.kasutil.media.IMediaSource#start()
		 */
		public static const PLAY:String = "play";
		
		/**
		 * 当操作IMediaSource对象停止播放时发出此事件.
		 * 从停止播放执行完成到IMediaSource对象真正停止之间可能会存在一定时间间隔，即停止播放操作和IMediaSource对象真正停止可能是异步的（也可能是同步的），
		 * 此事件是在停止播放操作执行之后，IMediaSource对象真正停止时才发出。
		 * @see org.rkuk.kasutil.media.IMediaSource#stop()
		 */
		public static const STOP:String = "stop";
		
		/**
		 * 当操作IMediaSource对象暂停播放时发出此事件.
		 * 从暂停播放执行完成到IMediaSource对象真正暂停之间可能会存在一定时间间隔，即暂停播放操作和IMediaSource对象真正暂停可能是异步的（也可能是同步的），
		 * 此事件是在暂停播放操作执行之后，IMediaSource对象真正暂停时才发出。
		 * @see org.rkuk.kasutil.media.IMediaSource#pause()
		 */
		public static const PAUSE:String = "pause";
		/**
		 * 当操作被暂停的IMediaSource对象继续从暂停时的时刻播放时发出此事件，IMediaSource对象在从缓冲状态变为播放状态时也会发出此事件.
		 * 从继续播放执行完成到IMediaSource对象真正继续播放之间可能会存在一定时间间隔，即继续播放操作和IMediaSource对象真继续播放可能是异步的（也可能是同步的），
		 * 此事件是在继续播放操作执行之后，IMediaSource对象真正继续播放时才发出。
		 * @see org.rkuk.kasutil.media.IMediaSource#resume()
		 */
		public static const RESUME:String = "resume";
		
		/**
		 * 当操作IMediaSource对象跳到指定时刻播放时发出此事件.
		 * 从操作执行完成到IMediaSource对象真正跳到指定时刻播放之间可能会存在一定时间间隔，即操作和IMediaSource对象真正跳到指定时刻播放可能是异步的（也可能是同步的），
		 * 此事件是在操作执行之后，IMediaSource对象真正跳到指定时刻播放时才发出。
		 * @see org.rkuk.kasutil.media.IMediaSource#seek()
		 */
		public static const SEEK:String = "seek";
		
		/**
		 * 当IMediaSource对象播放完成时发出此事件.
		 */
		public static const END:String = "end";
		
		/**
		 * 当IMediaSource对象在播放过程中，缓冲区数据变空时会发出此事件.
		 * IMediaSource对象缓冲区数据变空时表现为播放过程中的停顿，此时IMediaSource对象会自动加载数据到缓冲区，当加载满之后会继续播放，并发出RESUME事件。
		 * @see	#RESUME
		 */
		public static const BUFFER:String = "buffer";
		
		/**
		 * 当IMediaSource对象所播放的数据文件地址改变时发出此事件。
		 */
		public static const RESET:String = "reset";
		
		/**
		 * 当废弃IMediaSource对象时发出此事件.
		 * 此事件发出时IMediaSource对象的属性和方法将不可用，IMediaSource对象使用的相应资源将会待垃圾回收时清除内存。
		 * @see org.rkuk.kasutil.media.IMediaSource#dispose()
		 */
		public static const DISPOSE:String = "dispose";
		
		/**
		 * @inheritDoc
		 */
		public function MediaSourceEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false)
		{
			super(type, bubbles, cancelable);
		}
		
		/**
		 * @inheritDoc
		 */
		public override function clone():Event
		{
			return new MediaSourceEvent(type, bubbles, cancelable);
		}
		
		/**
		 * @inheritDoc
		 */
		public override function toString():String
		{
			return formatToString("MediaSourceEvent", "type", "bubbles", "cancelable", "eventPhase");
		}
	}
}